//
//  InputProcessor.m
//  Soccer
//
//  Created by Hyun-Woong Kim on 09. 05. 01.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "InputProcessor.h"
#import "ClientManager.h"
#import "Constant.h"
#import "PASoundSource.h"
#import "GameLayer.h"
#import "NetworkManager.h"

#define dragMin 3

/**
 InputProcessor
 */
@implementation InputProcessor

@synthesize player;
@synthesize ball;

- (id)init
{
	if (self = [super init])
	{
		player = nil;
		lastLocation = CGPointZero;
	}
	return self;
}

- (void)dealloc
{
	[player release];
	[ball release];
	[super dealloc];
}

- (void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	for (UITouch *touch in touches)
	{
		CGPoint location = [touch locationInView:[touch view]];
		if (location.x <= 240)
		{
			lastLocation = location;
		}
	}
}

- (void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
	for (UITouch *touch in touches)
	{
		CGPoint location = [touch locationInView:[touch view]];
		if (location.x <= 240)
		{
			// Cocoa의 원점은 좌측 상단이므로 y 좌표값에 -를 취해야 한다.
			CGPoint vector = CGPointMake(location.x - lastLocation.x, lastLocation.y - location.y);
			player.isMoving = YES;
			// 조작 방향에 해당하는 각도를 구한다.
			double cosTheta = vector.x / sqrt(vector.x * vector.x + vector.y * vector.y);
			double sinTheta = vector.y / sqrt(vector.x * vector.x + vector.y * vector.y);
			// rad 값은 -pi <= rad <= pi 로 나온다.
			player.dirRad = atan2(sinTheta, cosTheta);
		}
	}
}

- (void)touchEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
	for (UITouch *touch in touches)
	{
		CGPoint location = [touch locationInView:[touch view]];
		/* 화면의 왼쪽 절반은 player 컨트롤 영역이다 */
		if (location.x <= 240)
		{
			player.isMoving = NO;
		}
		/* 화면의 오른쪽 절반은 shoot 컨트롤 영역이다 */
		else
		{
			// 내가 컨트롤하고 있는 플레이어가 볼을 갖고 있는 경우
			if (ball.owner == player)
			{
				// 슛 발생시에 owner, shooter 정보를 직접 수정하지 않고 서버에 슛을 했음을 알린다.
				[[NetworkManager sharedNetworkManager] shootHappened];
			}
			// 내가 컨트롤하고 있는 플레이어에게는 볼이 없는 경우
			else
			{
				// 스틸 시도를 서버에 알린다.
				[[NetworkManager sharedNetworkManager] stealHappened];
			}
		}
	}
}

- (void)touchCanceled:(NSSet *)touches withEvent:(UIEvent *)event
{
	for (UITouch *touch in touches)
	{
		CGPoint location = [touch locationInView:[touch view]];
		if (location.x <= 240)
		{
			player.isMoving = NO;
		}
	}
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
	if ( fabs(acceleration.y) > 0.5 )
	{
		NSDate* currDate = [NSDate date];
		
		Match* match = [ClientManager sharedManager].match;
		match.shakedNum++;
		
		if (match.initDate == nil)
			match.initDate = currDate;
		
		NSTimeInterval interval = [currDate timeIntervalSinceDate:match.initDate];
		double effectiveTimeLimit = 2.0;
		
		// initDate와 currDate 사이에 시간 차이가 2초 이상이면 다시 시작.
		if (interval > effectiveTimeLimit)
		{
			match.initDate = currDate;
			match.shakedNum = 1;
			interval = 0;
		}
		
		// 특정 시간안에 특정 횟수 이상 흔든 경우, 스킬 발동한다.
		if(match.shakedNum >= 3 && interval <= 2.0)
		{
			// 스킬 시도를 서버에 알린다.
			[[NetworkManager sharedNetworkManager] skillHappened];
		}
		
		NSLog([NSString stringWithFormat:@"shaked, %f", acceleration.y]);
	}
}

@end
